/*
 * Description: 输入数字限制
 * Author: ty
 * Created on 2025-8-28 14:33
 * example: <input v-number-input="{min:0,max:100,precision:2}"></input>
 */
const numberInput = {
    bind(el,binding) {
        const oInput = el.tagName === 'INPUT' ? el : el.querySelector('input');
        if (!oInput) return;

        let options = binding.value || {};

        const handler = function () {
            let value = oInput.value;
            let oldValue = value;
            const regex = /[^0-9.-]/g;
            value = value.replace(regex, '');

            // 判断是否出现多个小数点
            let dotCount = (value.match(/\./g) || []).length;
            // 如果有，则只保留第一个
            if(dotCount > 1) {
                value = value.substring(0, value.lastIndexOf('.'));
            } else if(options.precision === 0) {
                value = value.replace(/\./g, '');
            }

            // 判断小数点位数，超出不能输入
            if(typeof options.precision == 'number') {
                let arr = value.split('.');
                if(arr.length > 1 && arr[1].length > options.precision) {
                    value = arr[0] + '.' + arr[1].substring(0, options.precision);
                }
            }

            // 判断是否可以出现负号
            if(!(!(typeof options.min == 'number') || options.min < 0)) {
                value = value.replace(/-/g, '');
            } else {
                const minusIndex = value.indexOf('-');
                if(minusIndex > 0) {
                    value = value.substring(0, value.lastIndexOf('-'));
                }
            }

            // 判断是否大于最大值
            if((typeof options.max == 'number') && value > options.max) {
                value = ''+options.max;
            }

            // 如果值发生变化，则更新输入框，一定要更新v-model
            if (oldValue !== value) {
                oInput.value = value;
                // 触发input事件使v-model更新
                const event = new Event('input', { bubbles: true });
                oInput.dispatchEvent(event);
            }
        }
        oInput.addEventListener('input', handler);
        
        // 保存handler以便解绑时使用
        el._numberInputHandler = handler;
    },
    unbind(el) {
        const oInput = el.tagName === 'INPUT' ? el : el.querySelector('input');
        if (oInput && el._numberInputHandler) {
            oInput.removeEventListener('input', el._numberInputHandler);
        }
    }
};

export default numberInput;